package com.examlpe.cels.service.impl;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import com.examlpe.cels.dao.IBaseTermDao;
import com.examlpe.cels.dao.ITestRecordDao;
import com.examlpe.cels.dao.impl.BaseTermDaoImpl;
import com.examlpe.cels.dao.impl.TestRecordDaoImpl;
import com.examlpe.cels.entity.BaseTerm;
import com.examlpe.cels.entity.TestRecord;
import com.examlpe.cels.entity.Vocabulary;
import com.examlpe.cels.entity.Word;
import com.examlpe.cels.exception.FileNotFoundException;
import com.examlpe.cels.exception.NoTestRecordException;
import com.examlpe.cels.service.ITestingService;

public class TestingServiceImpl implements ITestingService{

	//组合需要使用dao,此业务需要引用2个dao对象
	private ITestRecordDao testRecordDao = new TestRecordDaoImpl();
	private IBaseTermDao baseTermDao = new BaseTermDaoImpl();
	//此方法从原始的单词和词汇数据中，随机抽取出指定数量的数据，并以List集合返回
	////@Override
	public List<BaseTerm> getTestingData(int num) {
		//1.创建一个List
		List<BaseTerm> list = new ArrayList<BaseTerm>();
		List<BaseTerm> list1 = new ArrayList<BaseTerm>();
		try {
			//2.加载出所有的单词,并把它们放到这个集合中
			Set<Word> wSet = baseTermDao.getAllWords();
			list.addAll(wSet);
			//3.加载出所有的词汇,并把它们放到这个集合中
			Set<Vocabulary> vSet = baseTermDao.getAllVocabularies();
			list.addAll(vSet);
			//4.打乱整个List
			Collections.shuffle(list);
			//5.获取起始坐标位置
			for(int i=0;i<num;i++) {
				//6.创建一个需要返回的集合，并从已打乱顺序的集合中取出指定数目的数据
				list1.add(list.get(i));
			}
		} catch (FileNotFoundException e) {
			System.out.println("文件找不到");
		}
		//7.返回
		return list1;
	}
	
	/**
	 * 查看已经保存过的测试数据，只需直接读到即可
	 */
	//@Override
	public List<TestRecord> reviewTestRecord() throws NoTestRecordException {
//		testRecordDao.read(TESTRECORD_DIR+File.separator+TEST_RECORD_FILE);
		//1.判断存放测试数据的目录结构是否存在，如果不存在，则创建它
		//2.创建文件的file对象，以存放测试数据的目录结构为父目录
		//3.判断此文件是否存在，如果不存在，则直接抛出NoTestRecordException异常
		//4.如果没有抛出异常，则调用dao来读取数据
		return testRecordDao.read(TESTRECORD_DIR+File.separator+TEST_RECORD_FILE);
	}

	//持久化测试的数据
	//@Override
	public void saveTestRecord(TestRecord record) throws NoTestRecordException {
		//1.判断存在测试数据的目录是否存在，如果不存在，则创建它
		File dir = new File(TESTRECORD_DIR);
		if(!dir.exists()) {
			dir.mkdir();
		}
		//2.创建一个集合，存放我们需要写入文件的测试数据
		List<TestRecord> newRecords = null;
		//3.创建真正写入数据的文件
		File file = new File(TESTRECORD_DIR+File.separator+TEST_RECORD_FILE);
		//4.判断此文件是否存在
		if(file.exists()) {
			//4.1如果存在,则就先读取原来的数据
			newRecords  = reviewTestRecord();
			//4.1.1调用dao的read方法读取原来的数据，并把现有的测试对象添加到集合中去
			newRecords.add(record);
			//4.1.2调用集合的排序方法进行排序,注：这要求TestRecord类型要实现compareTo接口,
			Collections.sort(newRecords);
		}else {
			//4.2如果不存在，则是第一次保存
			//4.2.1创建一个新的集合
			newRecords = new ArrayList<TestRecord>();
			//4.2.2把测试对象添加到这个集合中
			newRecords.add(record);
			Collections.sort(newRecords);
		}
		//并把测试记录的时间降序排序
		//5.调用dao的write方法把这个集合写入到文件中
		testRecordDao.write(newRecords, TESTRECORD_DIR+File.separator+TEST_RECORD_FILE);
	}

}
